本章介绍如何使用 FileChooser 类来使用户能够浏览文件系统。本章提供的示例说明了如何打开一个或多个文件,配置文件选择器对话框窗口以及保存应用程序内容。
与其他用户界面组件类不同,FileChooser 类不属于 javafx.scene.controls 包。然而,由于它支持典型的 GUI 应用程序功能之一:文件系统导航,因此在 JavaFX UI Controls 教程中值得一提。
FileChooser 类位于 javafx.stage 包中,与其他基本的根图形元素(如 Stage、Window 和 Popup)一起。在图28-1中的“查看图片”窗口是 Windows 中文件选择器对话框的一个示例。
图28-1 文件选择器窗口示例
“图28-1 文件选择器窗口示例”的描述打开文件
文件选择器可以用于调用打开对话框窗口,选择单个文件或多个文件,并启用文件保存对话框窗口。要显示文件选择器,通常使用FileChooser类。在您的应用程序中启用文件选择器的最简单方法如示例28-1所示。
示例28-1 显示文件选择器
FileChooser fileChooser = new FileChooser();fileChooser.setTitle("打开资源文件");fileChooser.showOpenDialog(stage);将示例28-1中的代码添加到JavaFX应用程序后,文件选择器对话框窗口将在应用程序启动时立即显示,如图28-2所示。
图28-2 简单文件选择器
"图28-2 简单文件选择器"的描述注意:
图28-2显示的是Windows中的文件选择器。在其他支持此功能的操作系统中打开文件选择器时,您会收到其他窗口。图28-3和图28-4显示了Linux和Mac OS中文件选择器窗口的示例。
图28-3 Linux中的文件选择器窗口
"图28-3 Linux中的文件选择器窗口"的描述图28-4 Mac OS中的文件选择器窗口
"图28-4 Mac OS中的文件选择器窗口"的描述尽管在前面的示例中,文件选择器在应用程序启动时自动出现,但更典型的方法是通过选择相应的菜单项或点击专用按钮来调用文件选择器。在本教程中,您将创建一个应用程序,使用户能够点击一个按钮并打开文件系统中的一个或多个图片。 示例28-2显示了实现此任务的FileChooserSample应用程序的代码。
示例28-2 打开文件选择器以进行单个和多个选择
import java.awt.Desktop;import java.io.File;import java.io.IOException;import java.util.List;import java.util.logging.Level;import java.util.logging.Logger;import javafx.application.Application;import javafx.event.ActionEvent;import javafx.geometry.Insets;import javafx.scene.Scene;import javafx.scene.control.Button;import javafx.scene.layout.GridPane;import javafx.scene.layout.Pane;import javafx.scene.layout.VBox;import javafx.stage.FileChooser;import javafx.stage.Stage; public final class FileChooserSample extends Application { private final Desktop desktop = Desktop.getDesktop(); @Overridepublic void start(final Stage stage) {stage.setTitle("文件选择器示例"); final FileChooser fileChooser = new FileChooser(); final Button openButton = new Button("打开图片...");final Button openMultipleButton = new Button("打开图片..."); openButton.setOnAction((final ActionEvent e) -> {File file = fileChooser.showOpenDialog(stage);if (file != null) {openFile(file);}});openMultipleButton.setOnAction((final ActionEvent e) -> { List list = fileChooser.showOpenMultipleDialog(stage);if (list != null) { list.stream().forEach((file) -> {openFile(file);});}}); final GridPane inputGridPane = new GridPane(); GridPane.setConstraints(openButton, 0, 0);GridPane.setConstraints(openMultipleButton, 1, 0);inputGridPane.setHgap(6);inputGridPane.setVgap(6);inputGridPane.getChildren().addAll(openButton, openMultipleButton); final Pane rootGroup = new VBox(12);rootGroup.getChildren().addAll(inputGridPane);rootGroup.setPadding(new Insets(12, 12, 12, 12)); stage.setScene(new Scene(rootGroup));stage.show();} public static void main(String[] args) {Application.launch(args);} private void openFile(File file) {EventQueue.invokeLater(() -> {try {desktop.open(file);} catch (IOException ex) {Logger.getLogger(FileChooserSample.class.getName()).log(Level.SEVERE, null, ex);}});}}在示例28-2中,"打开图片"按钮允许用户打开一个文件选择器进行单个选择,而"打开图片"按钮允许用户打开一个文件选择器进行多个选择。这两个按钮的setOnAction方法几乎相同,唯一的区别在于用于调用FileChooser的方法。
showOpenDialog方法显示一个新的文件打开对话框,用户可以选择一个文件。该方法返回指定用户选择的文件或null(如果未进行选择)的值。
showOpenMultipleDialog方法显示一个新的文件打开对话框,用户可以选择多个文件。该方法返回指定用户选择的文件列表或null(如果未进行选择)的值。返回的列表不能被修改,并在每次修改尝试时抛出UnsupportedOperationException。
这两个方法在显示的打开对话框窗口被关闭之前不会返回结果(换句话说,直到用户提交或取消选择)。
当您编译和运行FileChooserSample应用程序时,会产生如图28-5所示的窗口。
图28-5 带有两个按钮的FileChooserSample
"图28-5 带有两个按钮的FileChooserSample"的描述当您单击任一按钮时,将显示如图28-6所示的对话框窗口。打开的文件选择对话框窗口显示的位置是您操作系统的默认位置。
图28-6 默认文件选择窗口
"图28-6 默认文件选择窗口"的描述FileChooserSample应用程序的用户可以导航到包含图片的目录并选择一张图片。选择文件后,它将使用java.awt.Desktop类的open方法打开关联的应用程序。示例代码通过使用desktop.open(file);来实现这一点。
注意:
Desktop 类的可用性取决于平台。请参考API 文档了解有关 Desktop 类的